#ifndef __TEST_H__
#define __TEST_H__

#include "all.h"

#define END 0

typedef enum
{
    TEST_IIC_PASS,
    TEST_IIC_NO_DEVICE,
    TEST_IIC_ADDRESS_ERR,
    TEST_IIC_LENTH_ERR,
    TEST_IIC_PIN_ERR,
    TEST_COMP_PASS = 0,
    TEST_COMP_ERR,
} test_ret_t;

typedef enum
{
    RELAY_CH_1 = 1,
    RELAY_CH_2,
    RELAY_CH_3,
    RELAY_CH_4
} RELAY_CHANNEL;

typedef enum
{
    VOLTAGE = 1,
    CURRENT
} VOL_CU_CH;

typedef enum
{
    LOW_LEVEL,
    HIGH_LEVEL,
    ALL_PINS_LEVEL
} VOLTAGE_LEVEL;

typedef uint8_t PIN;
typedef uint8_t CHANNEL;

/**
 * @brief 系统软硬件复位
 */
void sys_reset();

/**
 * @brief 测试通过，点亮pass灯
 */
void test_pass();

/**
 * @brief 测试失败，点亮fail灯
 *
 */
void test_fail();

/**
 * @brief 获取16个pin的电平
 *
 * @return uint16_t
 */
uint16_t get_pin_data();

/**
 * @brief 打开电源通道
 *
 * @param ch 通道 1/2
 * @param v 电压
 */
void power_on_v(CHANNEL ch, float v);

/**
 * @brief 关闭电源通道
 *
 * @param ch 通道 1/2
 */
void power_off(CHANNEL ch);

/**
 * @brief 获取指定pin的电压
 *
 * @param pin 多功能pin脚，以0结尾
 * @return float
 */
float get_pin_voltage(PIN pin);

/**
 * @brief 获取指定通道的参数
 *
 * @param ch 通道 1/2
 * @param VOL_CU_CH VOLTAGE/CURRENT
 * @return float 电压或电流
 */
float get_force_pmu(CHANNEL ch, VOL_CU_CH v_i);

/**
 * @brief 设置芯片的输出引脚
 *
 * @param pin 多功能pin脚，以0结尾
 * @param ...
 */
void sel_ic_out_pin(PIN pin, ...);

/**
 * @brief 设置芯片的输入引脚
 *
 * @param pin 多功能pin脚，以0结尾
 * @param ...
 */
void sel_ic_in_pin(PIN pin, ...);

/**
 * @brief 设置pin的电平
 *
 * @param logic HIGH_LEVEL(1)高电平,LOW_LEVEL(0)低电平
 * @param pin 多功能pin脚，以0结尾
 * @param ...
 */
void set_ic_pin(VOLTAGE_LEVEL logic, PIN pin, ...);

/**
 * @brief 对比管脚的电平
 *
 * @param logic HIGH_LEVEL(1)高电平,LOW_LEVEL(0)低电平,ALL_PINS_LEVEL返回16个pin的bit电平
 * @param pin 多功能pin脚，以0结尾
 * @param ...
 * @return uint16_t logic为HIGH_LEVEL(1)或者LOW_LEVEL(0)时，如果对比的引脚均满足状态，返回结果为TEST_COMP_PASS，
 *                  任意PIN电平不满足状态返回TEST_COMP_ERR,logic为ALL_PINS_LEVEL时，返回全部16个pin的bit电平，最低位对应PIN1,最高位对应PIN16
 */
uint16_t comp_ic_pin(VOLTAGE_LEVEL logic, PIN pin, ...);

/**
 * @brief 设定指定pin的电平
 *
 * @param pin 多功能pin脚
 * @param level HIGH_LEVEL(1)高电平,LOW_LEVEL(0)低电平
 */
void set_pin_level(PIN pin, VOLTAGE_LEVEL level);

/**
 * @brief 读取指定pin的电平
 *
 * @param pin 多功能pin脚
 * @return HIGH_LEVEL(1)高电平,LOW_LEVEL(0)低电平
 */
VOLTAGE_LEVEL read_pin_level(PIN pin);

/**
 * @brief 打开功能继电器
 *
 * @param num RELAY_CN_1\2\3\4
 */
void relay_on(RELAY_CHANNEL num);

/**
 * @brief 关闭功能继电器
 *
 * @param num RELAY_CN_1\2\3\4
 */
void relay_off(RELAY_CHANNEL num);

/**
 * @brief 给电压测电流
 *
 * @param pin 多功能pin脚
 * @param ch 电源通道 1/2
 * @param voltage 电压
 * @return float
 */
float pin_vi_test(PIN pin, CHANNEL ch, float voltage);

/**
 * @brief 给电流测电压
 *
 * @param pin 多功能pin脚
 * @param ch 电源通道 1/2
 * @param current 电流（uA）
 * @return float
 */
float pin_iv_test(PIN pin, CHANNEL ch, float current);

/**
 * @brief 打印16个bit位的高低电平
 *
 * @param var 打印的数
 */
void printf_16bit(uint16_t var);

/**
 * @brief 关闭通道、继电器
 */
void power_off_all();

/**
 * @brief IIC设备写数据
 * 
 * @param SDA 数据PIN号
 * @param SCL 时钟PIN号
 * @param dev_addr 从机8位IIC地址
 * @param reg_addr 寄存器地址
 * @param write_buffer 指向要写入的数据
 * @param lenth 数据字节数长度
 * @return test_ret_t 
 */
test_ret_t test_iic_write(PIN SDA, PIN SCL, uint8_t dev_addr, uint8_t reg_addr, uint8_t *write_buffer, size_t lenth);

/**
 * @brief IIC设备读数据
 * 
 * @param SDA 数据PIN号
 * @param SCL 时钟PIN号
 * @param dev_addr 从机8位IIC地址
 * @param reg_addr 寄存器地址
 * @param read_buffer 指向用于接收数据的缓存数组
 * @param lenth 数据字节数长度
 * @return test_ret_t 
 */
test_ret_t test_iic_read(PIN SDA, PIN SCL, uint8_t dev_addr, uint8_t reg_addr, uint8_t *read_buffer, size_t lenth);

/**
 * @brief 扫描IIC设备
 * 
 * @param SDA_PIN 数据PIN号
 * @param SCL_PIN 时钟PIN号
 * @return test_ret_t 
 */
test_ret_t test_iic_scan_devices(PIN SDA_PIN, PIN SCL_PIN);

#endif
